package main

/*
再次改造，让客户端可以直接类似本地调用服务端方法，不用call方法
*/

import (
	"learn_grpc/1_Rpc/5_client_loca_rpc/handler"
	"learn_grpc/1_Rpc/5_client_loca_rpc/server_proxy"
	"net"
	"net/rpc"
)

/*
将业务逻辑和服务端分离，将业务逻辑写到handler中
*/

// HelloService 定义一个简单结构体
//type HelloService struct{}
//
//// Hello 给结构体封装方法
//func (s *HelloService) Hello(request string, reply *string) error {
//	//修改入参指向的值
//	*reply = "Hello " + request
//	return nil
//}

func main() {
	//1、实例化server ,采用net来实例化server,并指定地址端口及端口协议
	listener, err := net.Listen("tcp", ":1234")
	if err != nil {
		panic("failed to listen: " + err.Error())
	}
	//将结构体HelloService{}对象注册到rpc中，名称(随便)：HelloService_1 ( 这里是2、注册处理逻辑handle )
	//_ = rpc.RegisterName(handler.HolleWorldServer_1, &handler.HelloService{})
	//采用封装后的注册函数
	_ = server_proxy.RegisterHelloService(&handler.HelloService{})
	//3、启动一个服务，刚才的listener接收请求，相当新的请求进来
	for {
		conn, err := listener.Accept()
		if err != nil {
			panic("failed to accept connection" + err.Error())
		}
		//将请求的socket给到rp后续处理，即将net和rpc关联起来
		rpc.ServeConn(conn)
		//缺点：只能处理一次请求
	}

}
